package com.demo.java.OD601_650.OD646;

import java.util.Scanner;
import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【工单调度策略(A卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146975509
 */
public class OdMain {
    public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();  // 获取工单的数量
        int[][] tasks = new int[n][2];  // 用于存储每个任务的工单号和SLA时间

        // 读取每个任务的工单号和SLA时间
        for (int i = 0; i < n; i++) {
            tasks[i][0] = in.nextInt();  // 工单号
            tasks[i][1] = in.nextInt();  // SLA时间
        }

        // 按照积分大小先排序，积分高的优先处理
        Arrays.sort(tasks, (a, b) -> b[1] - a[1]);

        // 用于记录每个SLA任务可获得的最大积分
        int[] maxScore = new int[n + 1];  // maxScore[i]表示SLA时间为i时的最大积分

        // 遍历任务进行调度
        for (int i = 0; i < tasks.length; i++) {
            // 如果当前SLA时间没有被赋值过，直接为该SLA时间分配任务
            if (maxScore[tasks[i][0]] == 0) {
                maxScore[tasks[i][0]] = tasks[i][1];  // 分配积分
            } else {
                // 如果当前SLA时间已被占用，寻找前一个空闲的SLA时间
                int t = tasks[i][0] - 1;
                while (t > 0 && maxScore[t] != 0) {
                    t--;  // 查找空闲的SLA时间
                }
                // 如果找到了空闲的SLA时间，可以完成当前任务
                if (t > 0) {
                    maxScore[t] = tasks[i][1];  // 分配积分
                }
            }
        }

        // 计算总积分
        int res = 0;
        for (int score : maxScore) {
            res += score;  // 累加所有任务的积分
        }

        // 输出总积分
        System.out.println(res);
    }
}